import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import javax.swing.*;
import java.net.URL;
import java.io.*;
import java.util.*;
import java.lang.reflect.*;

public class ImageDropTargetDemo extends JPanel
    implements DropTargetListener {

    DropTarget dropTarget;
    JLabel dropHereLabel;
    static DataFlavor urlFlavor, uriListFlavor, macPictStreamFlavor;
    static {
        try {
            urlFlavor =
                new DataFlavor ("application/x-java-url; class=java.net.URL");
            uriListFlavor =
                new DataFlavor ("text/uri-list; class=java.lang.String");
            macPictStreamFlavor =
                new DataFlavor ("image/x-pict; class=java.io.InputStream");
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
    }

    public ImageDropTargetDemo()  {
        super(new BorderLayout());
        dropHereLabel = new JLabel ("   Drop here   ",
                                    SwingConstants.CENTER);
        dropHereLabel.setFont (getFont().deriveFont (Font.BOLD, 24.0f));
        add (dropHereLabel, BorderLayout.CENTER);
        // set up drop target stuff
        dropTarget = new DropTarget (dropHereLabel, this);
    }

    public static void main (String[] args) {
        JFrame frame = new JFrame ("Image DropTarget Demo");
        ImageDropTargetDemo demoPanel = new ImageDropTargetDemo();
        frame.getContentPane().add (demoPanel);
        frame.pack();
        frame.setVisible(true);
    }


    // drop target listener events

    public void dragEnter (DropTargetDragEvent dtde) {
        System.out.println ("dragEnter");
    }

    public void dragExit (DropTargetEvent dte) {
        System.out.println ("dragExit");
    }
   
    public void dragOver (DropTargetDragEvent dtde) {
        System.out.println ("dragOver");

    }

    public void drop (DropTargetDropEvent dtde) {
        System.out.println ("drop");
        dtde.acceptDrop (DnDConstants.ACTION_COPY_OR_MOVE);
        Transferable trans = dtde.getTransferable();
        System.out.println ("Flavors:");
        dumpDataFlavors (trans);
        boolean gotData = false;
        try {
            // try to get an image
            if (trans.isDataFlavorSupported (DataFlavor.imageFlavor)) {
                System.out.println ("image flavor is supported");
                Image img = (Image) trans.getTransferData (DataFlavor.imageFlavor);
                showImageInNewFrame (img);
                gotData = true;
            } else if (trans.isDataFlavorSupported (
                              DataFlavor.javaFileListFlavor)) {
                System.out.println ("javaFileList is supported");
                java.util.List list = (java.util.List)
                    trans.getTransferData (DataFlavor.javaFileListFlavor);
                ListIterator it = list.listIterator();
                while (it.hasNext()) {
                    File f = (File) it.next();
                    ImageIcon icon = new ImageIcon (f.getAbsolutePath());
                    showImageInNewFrame (icon);
                }
                gotData = true;
            } else if (trans.isDataFlavorSupported (uriListFlavor)) {
                System.out.println ("uri-list flavor is supported");
                String uris = (String)
                    trans.getTransferData (uriListFlavor);
                // url-lists are defined by rfc 2483 as crlf-delimited
                StringTokenizer izer = new StringTokenizer (uris, "\r\n");
                while (izer.hasMoreTokens ()) {
                    String uri = izer.nextToken();
                    System.out.println (uri);
                    ImageIcon icon = new ImageIcon (uri);
                    showImageInNewFrame (icon);
                }
                gotData = true;
            } else if (trans.isDataFlavorSupported (urlFlavor)) {
                System.out.println ("url flavor is supported");
                URL url = (URL) trans.getTransferData (urlFlavor);
                System.out.println (url.toString());
                ImageIcon icon = new ImageIcon (url);
                showImageInNewFrame (icon);
                gotData = true;
            } else if (trans.isDataFlavorSupported (macPictStreamFlavor)) {
                System.out.println ("mac pict stream flavor is supported");
                InputStream in =
                    (InputStream) trans.getTransferData (macPictStreamFlavor);
                // for the benefit of the non-mac crowd, this is
                // done with reflection.  directly, it would be:
                // Image img =  QTJPictHelper.pictStreamToJavaImage (in);
                Class qtjphClass = Class.forName ("QTJPictHelper");
                Class[] methodParamTypes = { java.io.InputStream.class };
                Method method =
                    qtjphClass.getDeclaredMethod ("pictStreamToJavaImage", 
                                                  methodParamTypes);
                InputStream[] methodParams = { in };
                Image img = (Image) method.invoke (null, methodParams);
                showImageInNewFrame (img);
                gotData = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println ("gotData is " + gotData);
            dtde.dropComplete (gotData);
        }
    }

    public void dropActionChanged (DropTargetDragEvent dtde) {
        System.out.println ("dropActionChanged");

    }

    public void showImageInNewFrame (ImageIcon icon) {
        JFrame frame = new JFrame();
        frame.getContentPane().add (new JLabel (icon));
        frame.pack();
        frame.setVisible(true);
    }

    public void showImageInNewFrame (Image image) {
        showImageInNewFrame (new ImageIcon (image));
    }

    private void dumpDataFlavors (Transferable trans) {
        System.out.println ("Flavors:");
        DataFlavor[] flavors = trans.getTransferDataFlavors();
        for (int i=0; i<flavors.length; i++) {
            System.out.println ("*** " + i + ": " + flavors[i]);
        }
    }


}
